﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AccesoData;
using Entidades;
using Logica.Interfaces;

namespace Logica.Comandos.Lugar
{
    /// <summary>
    /// Comando que almacena los datos de un lugar
    /// </summary>
    public class ComandoCrearLugar: Comando, IAgregable
    {
        #region Overrides of Comando

        public override void Ejecutar()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region Implementation of IAgregable (Sin Implementacion)

        public int Ejecutar(Aseguradora aseguradora)
        {
            throw new NotImplementedException();
        }

        public int Ejecutar(Entidades.Cliente cliente)
        {
            throw new NotImplementedException();
        }

        public int Ejecutar(Inspeccion inspeccion, Aseguradora aseguradora)
        {
            throw new NotImplementedException();
        }

        public int Ejecutar(Personal personal)
        {
            throw new NotImplementedException();
        }

        public int Ejecutar(Entidades.Poliza poliza)
        {
            throw new NotImplementedException();
        }

        public int Ejecutar(Recaudo recaudo)
        {
            throw new NotImplementedException();
        }

        public int Ejecutar(RecaudoInspeccion recaudoInspeccion)
        {
            throw new NotImplementedException();
        }

        public int Ejecutar(Entidades.Ramo ramo)
        {
            throw new NotImplementedException();
        }

        public int Ejecutar(Entidad recaudo, Entidad ramo)
        {
            throw new NotImplementedException();
        }

        public int Ejecutar(DetalleEstimado detalle)
        {
            throw new NotImplementedException();
        }

        public int Ejecutar(Entidades.Siniestro siniestro)
        {
            throw new NotImplementedException();
        }

        public int Ejecutar(Entidades.Sucursal sucursal)
        {
            throw new NotImplementedException();
        }

        #endregion

        /// <summary>
        /// metodo que verifica que los datos que se quieran almacenar no sean repetidos
        /// </summary>
        /// <param name="lugar"></param>
        /// <returns></returns>
        private int ExisteLugar(Entidades.Lugar lugar)
        {
            int id = 0;
            lugar.Nombre = lugar.Nombre.ToLower();
            lugar.Tipo = lugar.Tipo.ToLower();
            id = DAO.ObtenerFabrica(1).ObtenerDaoLugar().ObtenerLugarNombreTipo(lugar);
            return id;
        }

        /// <summary>
        /// dado un lugar separa las entidades del lugar organizandolas en una lista
        /// </summary>
        /// <param name="lugar"></param>
        /// <returns></returns>
        private List<Entidades.Lugar> Lista(Entidades.Lugar lugar)
        {

            List<Entidades.Lugar> listaLugar = new List<Entidades.Lugar>();
            Entidades.Lugar estado = lugar;
            Entidades.Lugar ciudad = (estado != null) ? estado.Descendiente : null;
            Entidades.Lugar urbanizacion = (ciudad != null) ? ciudad.Descendiente : null;
            Entidades.Lugar calle = (urbanizacion != null) ? urbanizacion.Descendiente : null;
            Entidades.Lugar casa = (calle != null) ? calle.Descendiente : null;
            Entidades.Lugar piso = (casa != null) ? casa.Descendiente : null;

            if (estado != null)
            {
                estado.IdLugar = -1;
                listaLugar.Add(estado);
            }
            if (ciudad != null) listaLugar.Add(ciudad);
            if (urbanizacion != null) listaLugar.Add(urbanizacion);
            if (calle != null) listaLugar.Add(calle);
            if (casa != null) listaLugar.Add(casa);
            if (piso != null) listaLugar.Add(piso);
            return listaLugar;
        }
        /// <summary>
        /// Almacena los datos de un lugar
        /// </summary>
        /// <param name="lugar"></param>
        /// <returns></returns>
        public int Ejecutar(Entidades.Lugar lugar)
        {
            try
            {
                List<Entidades.Lugar> listaLugar = Lista(lugar); 

                for (int i = 0; i < listaLugar.Count - 1; i++)
                {
                    listaLugar[i].Nombre = listaLugar[i].Nombre.ToLower();
                    listaLugar[i].Tipo = listaLugar[i].Tipo.ToLower();
                    listaLugar[i + 1].IdLugar = ExisteLugar(listaLugar[i]) == 0 ? 
                        DAO.ObtenerFabrica(1).ObtenerDaoLugar().AgregarLugar(listaLugar[i]) : 
                        ExisteLugar(listaLugar[i]);
                }
                listaLugar[listaLugar.Count - 1].Id = ExisteLugar(listaLugar[listaLugar.Count - 1]) == 0 ?
                        DAO.ObtenerFabrica(1).ObtenerDaoLugar().AgregarLugar(listaLugar[listaLugar.Count - 1]) :
                        ExisteLugar(listaLugar[listaLugar.Count - 1]);

                return listaLugar[listaLugar.Count-1].Id;
            }
            catch (Exception)
            {

                return -1;
            }
            
        }
    
    }
}
